import logging
from decimal import Decimal

from django.db.models import Q
from django.utils import timezone
from django.views.generic import View

from apps.order.models import Order
from apps.wechat.models import Wechat
from libs.utils import json_response

logger = logging.getLogger('error')


class WechatView(View):
    def get(self, request):
        keyword = request.GET.get('keyword')
        if keyword:
            users = Wechat.objects.filter(Q(nickname__icontains=keyword) | Q(mobile__icontains=keyword))
        else:
            users = Wechat.objects.all()
        return json_response(users)


def wx_pay_notify(out_trade_no, total_fee, time_end, transaction_id, attach=None):
    """
    处理微信支付结果通知
    :param out_trade_no: 订单号
    :param total_fee: 支付金额（单位：分）
    :param time_end: 支付完成时间（格式：YYYYMMDDHHmmss）
    :param transaction_id: 微信支付交易号
    :param attach: 附加数据
    :return: bool 是否处理成功
    """
    logger.info(f"收到微信支付通知: 订单号={out_trade_no}, 金额={total_fee}, 交易号={transaction_id}")

    try:
        # 查找订单
        order = Order.objects.filter(order_no=out_trade_no).first()
        if not order:
            logger.error(f"未找到订单: {out_trade_no}")
            return False

        # 检查订单状态，避免重复处理
        if order.status == 'paid':
            logger.info(f"订单已支付，忽略重复通知: {out_trade_no}")
            return True

        # 验证支付金额（微信支付金额单位为分，需要转换为元进行比较）
        expected_amount = int(Decimal(str(order.total_amount)) * 100)
        if expected_amount != int(total_fee):
            logger.error(f"支付金额不匹配: 期望={expected_amount}, 实际={total_fee}")
            return False

        # 更新订单状态
        order.status = 'paid'
        order.paid_time = timezone.now()
        order.transaction_id = transaction_id
        order.save()

        logger.info(f"订单支付成功: {out_trade_no}")
        return True

    except Exception as e:
        logger.exception(f"处理支付通知异常: {str(e)}")
        return False
